home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 19.zip
/
BS1 part 19
/
AmigaLibDisk 162.adf
/
LabyrinthII
/
talk.c
< prev
Wrap
C/C++ Source or Header
|
1988-10-02
|
3KB
|
135 lines
/* Speech routines by Russell Wallace 1988, developed from speech demo program
* in ROM Kernel Manual. Routines are as follows:
* openmouth () sets everything up - returns nonzero if error condition
* say (string) says a null-terminated character string
* closemouth () shuts everything down - don't use it if openmouth ()
* returned an error.
* Parameters for voice are contained in openmouth () and may be changed,
* so may MAXLEN if you have very long strings or all of them are going to
* be fairly short. Use +L if compiling with Aztec C. Requires presence of
* translator.library in system disk LIBS directory.
* This code may be freely used in writing Amiga programs. */
#include "exec/exec.h"
#include "exec/execbase.h"
#include "devices/narrator.h"
#include "libraries/translator.h"
#define MAXLEN 1024 /* Maximum length of translated string */
struct MsgPort *readport=0;
struct MsgPort *writeport=0;
struct MsgPort *CreatePort ();
struct IORequest *CreateExtIO ();
struct Library *OpenLibrary ();
struct narrator_rb *writeNarrator=0;
struct mouth_rb *readNarrator=0;
struct Library *TranslatorBase=0;
UBYTE *sampleinput;
UBYTE outputstring[MAXLEN];
BYTE audChanMasks[4]={3,5,10,12};
int openmouth ()
{
TranslatorBase=OpenLibrary ("translator.library",1);
if (TranslatorBase==0)
return (1);
writeport=CreatePort (0,0);
if (writeport==0)
{
closemouth ();
return (3);
}
readport=CreatePort (0,0);
if (readport==0)
{
closemouth ();
return (4);
}
writeNarrator=(struct narrator_rb *)CreateExtIO (writeport,sizeof(struct narrator_rb));
if (writeNarrator==0)
{
closemouth ();
return (5);
}
readNarrator=(struct mouth_rb *)CreateExtIO (readport,sizeof(struct mouth_rb));
if (readNarrator==0)
{
closemouth ();
return (6);
}
/* Set up parameters for write-message to Narrator device */
writeNarrator->ch_masks=(audChanMasks);
writeNarrator->nm_masks=sizeof(audChanMasks);
writeNarrator->message.io_Data=(APTR)outputstring;
writeNarrator->message.io_Length=strlen (outputstring);
writeNarrator->mouths=0; /* Don't bother calculating mouths */
writeNarrator->message.io_Command=CMD_WRITE;
/* Open device */
if (OpenDevice ("narrator.device",0,writeNarrator,0))
{
closemouth ();
return (7);
}
/* Set up parameters for read-message to Narrator device */
readNarrator->voice.message.io_Device=writeNarrator->message.io_Device;
readNarrator->voice.message.io_Unit=writeNarrator->message.io_Unit;
readNarrator->voice.message.io_Command=CMD_READ;
/* Send asynchronous write request to device */
if (SendIO (writeNarrator))
{
closemouth ();
return (8);
}
/* keep sending until says "no write in progress" */
do
DoIO (readNarrator);
while ((readNarrator->voice.message.io_Error)!=ND_NoWrite);
/* set parameters for speech */
writeNarrator->sex=FEMALE;
writeNarrator->pitch=DEFPITCH;
return (0); /* Everything OK */
}
say (string)
char *string;
{
(void)Translate (string,strlen (string),outputstring,MAXLEN);
writeNarrator->message.io_Data=(APTR)outputstring;
writeNarrator->message.io_Length=strlen (outputstring);
DoIO (writeNarrator);
}
closemouth ()
{
if (writeNarrator)
{
CloseDevice (writeNarrator);
DeleteExtIO (writeNarrator,sizeof(struct narrator_rb));
}
if (readNarrator)
DeleteExtIO (readNarrator,sizeof(struct mouth_rb));
if (writeport)
DeletePort (writeport);
if (readport)
DeletePort (readport);
if (TranslatorBase)
CloseLibrary (TranslatorBase);
}